package cn.itcast.nems.studentrecord.service.studentrecord;

import cn.itcast.nems.order.dto.PaymentFlowDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.*;

import java.util.List;

/**
 * @author liyong
 * create: 2023-11-20 16:32:37
 **/
public interface StudentRecordMessageService {
    /**
     * 创建学籍的tag
     */
    String STUDENT_RECORD_CRETED_TAG = "TAG_STUDENT_RECORD_CREATED";

    /**
     * 学籍支付的tag
     */
    String STUDENT_RECORD_PAID_TAG = "TAG_STUDENT_RECORD_PAID";

    /**
     * 学籍有效的tag
     */
    String STUDENT_RECORD_VALID_TAG = "TAG_STUDENT_RECORD_VALID";

    /**
     * 学员出班的tag
     */
    String STUDENT_RECORD_OUT_TAG = "TAG_STUDENT_RECORD_VALID";

    /**
     * 学籍发送的添加订单流水消息
     */
    String STUDENT_RECORD_ORDER_FLOW_TAG = "TAG_STUDENT_RECORD_ORDER_FLOW";

    /**
     * 学籍剩余应付金额发送变化
     */
    String STUDENT_RECORD_BALANCE_AMOUNT_DUE_TAG = "TAG_STUDENT_RECORD_BALANCE_AMOUNT_DUE";

    /**
     * 发送学籍已创建消息
     *
     * @param studentRecordCreateMessageDTO 创建学籍的参数
     */
    void studentRecordCreated(StudentRecordCreateMessageDTO studentRecordCreateMessageDTO);

    /**
     * 学籍支付
     *
     * @param studentRecordPaidMessageDTO 参数
     */
    void studentRecordPaid(StudentRecordPaidMessageDTO studentRecordPaidMessageDTO);

    /**
     * 学籍生效
     *
     * @param studentRecordValidMessageDTO 参数
     */
    void studentRecordValid(StudentRecordValidMessageDTO studentRecordValidMessageDTO);

    /**
     * 学员出班
     *
     * @param studentRecordMessageDTO 参数
     */
    void studentRecordOut(StudentRecordMessageDTO studentRecordMessageDTO);

    /**
     * 发送学籍创建订单流水消息；为了解决学籍创建支付流水及学籍监听支付消息产循环依赖，该方法延时添加订单流水，确保学籍相关的操作事已提交
     *
     * @param flows 订单流水
     */
    void sendOrderFlowMessages(List<PaymentFlowDTO> flows);

    /**
     * 学籍剩余应付金额变更
     *
     * @param balanceAmountDueMessageDTO 参数对象
     */
    void sendBalanceAmountDueChange(StudentRecordBalanceAmountDueMessageDTO balanceAmountDueMessageDTO);

    /**
     * 收到学籍发送的创建订单流水消息
     *
     * @param flow 订单流水
     */
    void receiveOrderFlowMessage(PaymentFlowDTO flow);
}
